package br.com.drestranho.escola.managed;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import br.com.drestranho.escola.dao.TurmaDAO;
import br.com.drestranho.escola.entity.Turma;

// Manager da tela manterTurmaList.xhtml, que exibe a tabela com turmas
// 
@ManagedBean  
@SessionScoped
public class ManterTurmaManager implements Serializable {
	@EJB
	TurmaDAO turmaDAO = new TurmaDAO();
	Turma turmaSelec;
	boolean modoInsert;
	List<Turma> turmas;
	List<Integer> anos;
	Integer anoSelec;
	
	public List<Integer> getAnos() {
		return anos;
	}

	public void setAnos(List<Integer> anos) {
		this.anos = anos;
	}

	public Integer getAnoSelec() {
		return anoSelec;
	}

	public void setAnoSelec(Integer anoSelec) {
		this.anoSelec = anoSelec;
	}

	// chamado para popular a tabela nao so na criacao como tambem quando seu coneudo eh mudado
	@PostConstruct
	public void iniciarTabela() {
		turmas = null;
		turmas = (ArrayList<Turma>) turmaDAO.getBeans();
		Collections.sort(turmas, new ComparaTurma());
		setModoInsert(false);
		anos = turmaDAO.carregaAnos();
		for (Integer i : anos) System.out.println("* "+i);
	}

	public Turma getTurmaSelec() {
		return turmaSelec;
	}

	public void setTurmaSelec(Turma turmaSelec) {
		this.turmaSelec = turmaSelec;
	}

	public boolean getModoInsert() {
		return modoInsert;
	}

	public void setModoInsert(boolean modoInsert) {
		this.modoInsert = modoInsert;
	}

	public List<Turma> getTurmas() {
		return turmas;
	}
	
	public void setTurmas(List<Turma> turmas) {
		this.turmas = turmas;
	}
	
	public String cadastrar() {
		turmaSelec = new Turma();
		setModoInsert(true);
		return "manterTurmaForm";
	}
	
	public String editar() {
		setModoInsert(false);
		return "manterTurmaForm";
	}
	
	public String remover() {
		Turma f = turmaDAO.getBean(getTurmaSelec().getId());
		turmaSelec = null;
		turmaDAO.remover(f);
		iniciarTabela();
		return "";
	}
	
	public String salvar() {
		System.out.print("salvando "+turmaSelec.getId());
			turmaDAO.atualizar(getTurmaSelec());
			iniciarTabela();// nova entidade foi inserida; refazer a tabela
		return "manterTurmaList";
	}
	
	public String atualizar() {
		System.out.print("atual  "+turmaSelec.getId());
		turmaDAO.atualizar(getTurmaSelec());
		return "manterTurmaList";
	}
	
	
	// Classe interna que ordena os turmas por nome. ano decrescente, serie crescente
	public class ComparaTurma implements Comparator<Turma> {
		@Override
		public int compare(Turma turm1, Turma turm2) {
			switch (turm1.getAno().compareTo(turm2.getAno())) {
				case -1 :
					return 1;
				case 0 :
					switch (turm1.getSerie().compareTo(turm2.getSerie())) {
						case -1 :
							return -1;
						case 0 :
							return (turm1.getDigito().compareToIgnoreCase(turm2.getDigito()));
						case 1 :
							return -1;
					}
					break;
				case 1 :
					return -1;
			}
			return 0;
		}
	}
	
}